#ifndef __LINLIST
#define __LINLIST

#include <stdio.h>
////////////////////////////////////////////////////////////////////////
// LinList  (SLink)
////////////////////////////////////////////////////////////////////////

class RTree;

struct Linkable                     //a node in linked list
{
public:
	int son;
	int dimension;
	int level;
	float *bounces;
	float *velocity;
	float distanz;

	Linkable(int dim)
	{
		dimension = dim;
		bounces = new float[2 * dim];
		velocity = new float[2 * dim];
    }

	~Linkable()
	{ 
		delete [] bounces;
		delete [] velocity;
	}
};

struct SLink                    //a doubly-linked list
{
    Linkable *d;          // Pointer on element data, Zeiger auf Element-Daten,  
    SLink *next;          // Pointer on next element, Zeiger auf naechstes Element,  
    SLink *prev;          // Pointer on preceding element , Zeiger auf vorhergehendes Element, 

    SLink();
    ~SLink();
};

////////////////////////////////////////////////////////////////////////
// LinList
////////////////////////////////////////////////////////////////////////


class LinList              //create a class for Slink, unsorted list
{
protected:
    SLink *first;         // Pointer of root of the volume of data, Rootzeiger des Datenbestands,  
    SLink *last;          // Pointer on last element, Zeiger auf letztes Element,  
    int anz;                    // Number of occupied elements in the list , Anzahl der belegten Elemente in der Liste
    SLink *akt;           // points to current element , zeigt auf aktuelles Element
    int akt_index;              // Index of the element gotten last with GET, Index des zuletzt mit get geholten Elements
public:
    LinList();
    virtual ~LinList();
    int get_num()               // number of the element occupied in the index gives , gibt Anzahl der im Index belegten Elements
        { return anz; }         // back, zurueck

    void check();               // examines consistency of the list , ueberprueft Konsistenz der Liste
    void print();

    void insert(Linkable *f);       // an element attaches in front to the list , haengt ein Element vorne an die Liste an
    bool erase();               // current element from the list deletes , loescht aktuelles Element aus der Liste

    Linkable * get(int i);          // ith element supplies , liefert i-tes Element
    Linkable * get_first();         // first element supplies in the index , liefert erstes Element im Index
    Linkable * get_last();          // first element supplies in the index, liefert erstes Element im Index
    Linkable * get_next();          // next element supplies in the index , liefert naechstes Element im Index
    Linkable * get_prev();          // preceding element supplies in the index , liefert vorhergehendes Element im Index
};


////////////////////////////////////////////////////////////////////////
// SortedLinList
////////////////////////////////////////////////////////////////////////


class SortedLinList : public LinList   //sorted list
{
    bool increasing;
public:
    SortedLinList();

    void set_sorting(bool _increasing); //if increasing equal TRUE, becomes , wenn increasing gleich TRUE, wird
                                // ascending sorts , aufsteigend einsortiert
                                // THIS FUNCTION MUST BEFORE FIRST INSERTING ,DIESE FUNKTION MUSS VOR DEM ERSTEN EINFUEGEN
                                // CALLED, GERUFEN WERDEN !!!!!!!!!!!
    void insert(Linkable *f);       // an element inserts by direct inserting , fuegt ein Element durch direktes Einfuegen ein

    void sort(bool _increasing);//sorts the list ,  sortiert die Liste
};

#endif  // __LINLIST
